home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 041-050 / amok49 / oprof / txt / text.mod < prev    next >
Text File  |  1993-11-04  |  6KB  |  264 lines

  1. (*
  2.   :Program.       Text.mod (OProf)
  3.   :Author.        Volker Rudolph
  4.   :Address.       Lettow-Vorbeck-Str. 11 / 6750 Kaiserslautern 26
  5.   :Phone.         06301/8566
  6.   :Version.       1.22
  7.   :Date.          4.11.90
  8.   :Copyright.     Volker Rudolph (Shareware)
  9.   :Language.      Oberon
  10.   :Translator.    Oberon V1.17.1
  11.   :Imports.       MicroTimer, Printf
  12.   :Contents.      Laufzeit-Statistiken über Programme
  13. *)
  14.  
  15. MODULE Text;
  16.  
  17. IMPORT e:Exec,ob:OberonLib,p:Printf,l:Lists,as:ASCII,s:SYSTEM,st:Strings,
  18.        ex:Expressions,pr:ProfRunTime;
  19.  
  20. (* --- EXPORTED -------------------------------------------------------------- *)
  21.  
  22. CONST
  23.   (* Keywords *)
  24.   end       * =  0;
  25.   return    * =  1;
  26.   begin     * =  2;
  27.   procedure * =  3;
  28.   if        * =  4;
  29.   case      * =  5;
  30.   while     * =  6;
  31.   with      * =  7;
  32.   record    * =  8;
  33.   loop      * =  9;
  34.   module    * = 10;
  35.   close     * = 11;
  36.   halt      * = 12;
  37.   import    * = 13;
  38.  
  39. TYPE
  40.   MinExNodePtr * = POINTER TO MinExNode;
  41.   MaxExNodePtr * = POINTER TO MaxExNode;
  42.  
  43.   ExNode * = RECORD (l.Node)
  44.                semicolon * :BOOLEAN;
  45.                len       * :INTEGER;
  46.              END;
  47.  
  48.   MinExNode * = RECORD (ExNode)
  49.                   expression * :ex.MinExpression;
  50.                 END;
  51.  
  52.   MaxExNode * = RECORD (ExNode)
  53.                   expression * :ex.MaxExpressionPtr;
  54.                 END;
  55.  
  56. VAR
  57.   ExList * :l.List;
  58.  
  59. (*
  60.   PROCEDURE ReadText(name:ARRAY OF CHAR):BOOLEAN;
  61.   PROCEDURE WriteText():BOOLEAN;
  62.   PROCEDURE RemText;
  63.   PROCEDURE AddExpression(VAR str:ARRAY OF CHAR;at:l.NodePtr;semicolon:BOOLEAN);
  64.   PROCEDURE FindKeyWord(searchTypes:SET;
  65.                         VAR node:l.NodePtr;
  66.                         VAR key:INTEGER
  67.                        ):BOOLEAN;
  68. *)
  69.  
  70. (* --- NOT EXPORTED ---------------------------------------------------------- *)
  71.  
  72. CONST
  73.   OutOfMem = "Out of memory error";
  74.  
  75. VAR
  76.   keyWord:ARRAY import+1,15 OF CHAR;
  77.  
  78. (* -------------------------------------------------------------------------- *)
  79.  
  80. PROCEDURE RemText*;
  81. VAR
  82.   head:l.NodePtr;
  83. BEGIN
  84.   head := l.RemHead(ExList);
  85.   WHILE head # NIL DO
  86.     IF head^ IS MaxExNode THEN
  87.       DISPOSE(head(MaxExNode).expression);
  88.     END; (* IF *)
  89.     DISPOSE(head);
  90.     head := l.RemHead(ExList);
  91.   END; (* WHILE *)
  92. END RemText;
  93.  
  94. (* -------------------------------------------------------------------------- *)
  95.  
  96. PROCEDURE ReadText*(name:ARRAY OF CHAR):BOOLEAN;
  97. VAR
  98.   minEx:MinExNodePtr;
  99.   maxEx:MaxExNodePtr;
  100.   expression:ex.MaxExpression;
  101.   semicolon:BOOLEAN;
  102.   noMem:BOOLEAN;
  103.   len:INTEGER;
  104. BEGIN
  105.   IF ~ex.Open(name,ob.wbStarted) THEN
  106.     RETURN FALSE;
  107.   END; (* IF *)
  108.  
  109.   noMem := FALSE;
  110.  
  111.   REPEAT
  112.     ex.ReadExpression(expression,len,semicolon);
  113.  
  114.     IF len # 0 THEN
  115.       IF len < ex.MinExpressionLen THEN
  116.         NEW(minEx);
  117.         noMem := minEx = NIL;
  118.         IF ~noMem THEN
  119.           minEx.semicolon := semicolon;
  120.           minEx.len := len;
  121.           e.CopyMem(expression,minEx.expression,len);
  122.           l.AddTail(ExList,minEx);
  123.         END; (* IF *)
  124.       ELSE
  125.         NEW(maxEx);
  126.         noMem := maxEx = NIL;
  127.         IF ~noMem THEN
  128.           ob.New(maxEx.expression,len);
  129.           e.CopyMem(expression,maxEx.expression^,len);
  130.           maxEx.semicolon := semicolon;
  131.           maxEx.len := len;
  132.           l.AddTail(ExList,maxEx);
  133.         END; (* IF *)
  134.       END; (* IF *)
  135.     END; (* IF *)
  136.   UNTIL (len = 0) OR noMem;
  137.  
  138.   RETURN ~noMem;
  139. END ReadText;
  140.  
  141. (* -------------------------------------------------------------------------- *)
  142.  
  143. PROCEDURE WriteText*():BOOLEAN;
  144. VAR
  145.   node:l.NodePtr;
  146.   end,ok:BOOLEAN;
  147. BEGIN
  148.   ok := TRUE;
  149.   node := l.Head(ExList);
  150.   WHILE (node # NIL) & ok DO
  151.     IF node^ IS MinExNode THEN
  152.       ok := ex.WriteExpression(node(MinExNode).expression,node(MinExNode).len);
  153.     ELSIF node^ IS MaxExNode THEN
  154.       ok := ex.WriteExpression(node(MaxExNode).expression^,node(MaxExNode).len);
  155.     END; (* IF *)
  156.     end := l.Next(node);
  157.   END; (* WHILE *)
  158.  
  159.   RETURN ok;
  160. END WriteText;
  161.  
  162. (* -------------------------------------------------------------------------- *)
  163.  
  164. (* $CopyArrays- *)
  165. PROCEDURE AddExpression*(str:ARRAY OF CHAR;at:l.NodePtr;semicolon:BOOLEAN);
  166. VAR
  167.   newMaxEx:MaxExNodePtr;
  168.   len:INTEGER;
  169. BEGIN
  170.  
  171.   len := st.Length(str);
  172.  
  173.   NEW(newMaxEx);
  174.   pr.Assert(newMaxEx # NIL,OutOfMem);
  175.   ob.New(newMaxEx.expression,len);
  176.   pr.Assert(newMaxEx.expression # NIL,OutOfMem);
  177.  
  178.   newMaxEx.semicolon := semicolon;
  179.   newMaxEx.len := len;
  180.   e.CopyMem(str,newMaxEx.expression^,len);
  181.  
  182.  
  183.   IF at # NIL THEN
  184.     l.AddBehind(ExList,newMaxEx,at);
  185.   ELSE
  186.     l.AddHead(ExList,newMaxEx);
  187.   END; (* IF *)
  188.  
  189. END AddExpression;
  190.  
  191. (* -------------------------------------------------------------------------- *)
  192.  
  193. PROCEDURE FindKeyWord*(searchTypes:SET;
  194.                        VAR node:l.NodePtr;
  195.                        VAR key:INTEGER
  196.                       ):BOOLEAN;
  197. VAR
  198.   oldNode:l.NodePtr;
  199.   ok:BOOLEAN;
  200.  
  201.   (* $CopyArrays- *)
  202.   PROCEDURE Compare(str:ARRAY OF CHAR;key:INTEGER):BOOLEAN;
  203.   VAR
  204.     i:INTEGER;
  205.   BEGIN
  206.     i := 0;
  207.     WHILE keyWord[key,i] # as.nul DO
  208.       IF str[i] # keyWord[key,i] THEN
  209.         RETURN FALSE;
  210.       END; (* IF *)
  211.       INC(i);
  212.     END; (* WHILE *)
  213.     RETURN TRUE;
  214.   END Compare;
  215.  
  216. BEGIN
  217.   oldNode := node;
  218.   WHILE node # NIL DO
  219.     key := end;
  220.     WHILE (key <= import) DO
  221.       IF key IN searchTypes THEN
  222.         IF (node IS MaxExNode) THEN
  223.           IF Compare(node(MaxExNode).expression^,key) THEN
  224.             RETURN TRUE;
  225.           END; (* IF *)
  226.         ELSE
  227.           IF Compare(node(MinExNode).expression ,key) THEN
  228.             RETURN TRUE;
  229.           END; (* IF *)
  230.         END; (* IF *)
  231.       END; (* IF *)
  232.       INC(key);
  233.     END; (* WHILE *)
  234.     ok := l.Next(node);
  235.   END; (* WHILE *)
  236.   node := oldNode;
  237.   RETURN FALSE;
  238.  
  239. END FindKeyWord;
  240.  
  241. (* -------------------------------------------------------------------------- *)
  242.  
  243. BEGIN
  244.   l.Init(ExList);
  245.  
  246.   keyWord[end]       := "END";
  247.   keyWord[begin]     := "BEGIN";
  248.   keyWord[return]    := "RETURN";
  249.   keyWord[procedure] := "PROCEDURE";
  250.   keyWord[module]    := "MODULE";
  251.   keyWord[if]        := "IF";
  252.   keyWord[case]      := "CASE";
  253.   keyWord[with]      := "WITH";
  254.   keyWord[while]     := "WHILE";
  255.   keyWord[close]     := "CLOSE";
  256.   keyWord[import]    := "IMPORT";
  257.   keyWord[record]    := "RECORD";
  258.   keyWord[halt]      := "HALT";
  259.   keyWord[loop]      := "LOOP";
  260.  
  261. CLOSE
  262.   RemText;
  263. END Text.
  264.